import axios from 'axios'
import store from '@/store'
import { getToken } from '@/utils/auth'
import { Toast, Dialog } from 'vant'
import 'vant/es/toast/style'
import 'vant/es/dialog/style'

// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url基础路径
  timeout: 15000, // 请求超时时间
  retryTimes: 2, // 重试次数
  retryDelay: 1000 // 重试延迟时间(ms)
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 请求前处理
    if (store.getters.token) {
      // 让每个请求携带token
      config.headers['Authorization'] = `Bearer ${getToken()}`
    }
    return config
  },
  error => {
    // 请求错误处理
    console.error('请求错误', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    
    // 根据实际API返回格式调整
    // 假设后端返回的数据结构为 { code, data, message }
    if (res.code !== 200) {
      // 处理业务异常
      Toast({
        message: res.message || '操作失败',
        type: 'danger',
        duration: 5 * 1000
      })
      
      // 50008: 非法token; 50012: 其他客户端登录; 50014: token过期;
      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
        // 重新登录
        Dialog.confirm({
          title: '确认登出',
          message: '您已登出，请重新登录',
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
        }).then(() => {
          store.dispatch('user/resetToken').then(() => {
            location.reload()
          })
        })
      }
      return Promise.reject(new Error(res.message || '操作失败'))
    } else {
      return res.data
    }
  },
  error => {
    // 处理HTTP错误
    const { config, response } = error
    const status = response ? response.status : null
    
    // 处理重试机制
    if (config && config.retryTimes > 0) {
      // 设置重试计数器
      config.__retryCount = config.__retryCount || 0
      
      // 检查是否需要重试
      if (config.__retryCount < config.retryTimes && (status === 408 || status === 429 || status === 500 || status === 502 || status === 503 || status === 504 || !status)) {
        config.__retryCount += 1
        
        console.log(`接口 ${config.url} 第 ${config.__retryCount} 次重试`)
        
        // 创建延迟执行的promise
        const delayRetry = new Promise(resolve => {
          setTimeout(() => {
            resolve()
          }, config.retryDelay || 1000)
        })
        
        // 重试请求
        return delayRetry.then(() => {
          return service(config)
        })
      }
    }
    
    // 错误消息处理
    let errorMsg = ''
    
    if (status) {
      switch (status) {
        case 400:
          errorMsg = '请求错误'
          break
        case 401:
          errorMsg = '未授权，请重新登录'
          // 清除token并跳转登录页
          store.dispatch('user/resetToken').then(() => {
            location.reload()
          })
          break
        case 403:
          errorMsg = '拒绝访问'
          break
        case 404:
          errorMsg = '请求的资源不存在'
          break
        case 408:
          errorMsg = '请求超时'
          break
        case 429:
          errorMsg = '请求过于频繁，请稍后再试'
          break
        case 500:
          errorMsg = '服务器内部错误'
          break
        case 501:
          errorMsg = '服务未实现'
          break
        case 502:
          errorMsg = '网关错误'
          break
        case 503:
          errorMsg = '服务不可用'
          break
        case 504:
          errorMsg = '网关超时'
          break
        default:
          errorMsg = `未知错误 ${status}`
      }
    } else {
      if (error.message.includes('timeout')) {
        errorMsg = '请求超时'
      } else if (error.message.includes('Network Error')) {
        errorMsg = '网络错误，请检查您的网络连接'
      } else {
        errorMsg = error.message
      }
    }
    
    Toast({
      message: errorMsg,
      type: 'danger',
      duration: 5 * 1000
    })
    
    return Promise.reject(error)
  }
)

export default service 